Aurora Postgresqlでインスタンスロール(読み込み・書き込み)をクライアントから判別できますか?
困っていた内容
コネクションプーリングを利用しており、フェイルオーバーが発生すると、読み込みインスタンスに書き込みに行ってしまう。そのため、書き込みインスタンスをアプリケーション側から判定したい。
どう対応すればいいの?
Postgresqlに対して、SHOW transaction_read_only
を実行します。
実行結果により、そのコネクションからの接続先が読み込み・書き込みインスタンスかが確認できます。
- OFF 書き込みノード(プライマリ)です。
- ON 読み込みノード(Auroraレプリカ)です。
参考情報
Amazon Aurora PostgreSQL を使用する際のベストプラクティス
アプリケーションは、プライマリまたはセカンダリのすべてのノードタイプに接続の確立を試行します。接続したら、まずコマンド SHOW transaction_read_only の結果をクエリして、ノードの読み書きステータスを調べることをお勧めします。
返されるクエリの値が OFF の場合、プライマリノードへの接続に成功しました。返される値が ON の場合、アプリケーションは読み書き接続を要求しています。aurora_replica_status 関数を呼び出して、server_id に session_id='MASTER_SESSION_ID' があることを判断します。この関数は、プライマリノードの名前を表示します。これは、以下に説明する「endpointPostfix」とともに使用できます。
注意すべき点の 1 つは、古いデータを持つレプリカに接続するときです。この場合、aurora_replica_status 関数は最新ではない情報を表示することがあります。古さのしきい値はアプリケーションレベルで設定でき、サーバー時間と last_update_time の差異を見ることで確認できます。一般に、アプリケーションでは、aurora_replica_status 関数から返される情報が矛盾することによる 2 つのホスト間での急変を避ける必要があります。アプリケーションは、aurora_replica_status 関数から返されるデータに安易に従うのではなく、最初にすべての既知のホストを試す必要があります。